iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

大家有沒有覺得,每次都要開兩個終端機才能運行python而覺得麻煩,在想有沒有一個方案可以運行一個終端而且可以看終端輸出的呢?

有,而且很簡單,請讓我一個一個來說吧

subprocess

此為python內建的套件,不須從pip中安裝

此套件的功能,就是可以運行終端機的指令,例如:ls, mkdir等等的,當然,python的檔案也可以執行

subprocess.run()

程式碼:

import subprocess

subprocess.run(["ls"])

輸出效果如下

https://ithelp.ithome.com.tw/upload/images/20230926/201465552ZR7mMJOAh.png

subprocess.Popen()

程式碼:

import subprocess

subprocess.Popen(["ls"])

輸出效果如下

https://ithelp.ithome.com.tw/upload/images/20230926/201465552ZR7mMJOAh.png


你可能會想,兩個函式明明輸出結果一樣,那為什麼還要分兩個用法呢?

差別如下所示

  • Popen相比run,使用Popen跑需要執行一段時間的指令時不會延後後面程式碼執行,使用run則會等待指令完成後才執行下一行程示碼
  • Popen可以在python中輸出終端結果,run則不行

由此可知,Popen相比run,Popen更實用,更方便


Threading

有了subprocess的幫助,我們可以在python中執行終端機的指令

那我們也需要一個可以同時執行不同函式的功能,因此有了threading,可以把它想像成,可以多執行緒。

假設我們有一個很繁忙的函式要執行一段時間,程式碼如下

import threading
import time

def process1():
    arr = []
    for i in range(100):
        for j in range(100):
            for k in range(100):
                arr.append(i+j+k)

start  = time.time()
process1()
process1()
process1()
process1()

end  = time.time()

print("執行時間:%f 秒" % (end - start))
#output
#執行時間:0.342327 秒

使用threading後

import threading
import time

def process1():
    arr = []
    for i in range(100):
        for j in range(100):
            for k in range(100):
                arr.append(i+j+k)

start  = time.time()

jobs = []
jobs.append(threading.Thread(target=process1))
jobs.append(threading.Thread(target=process1))
jobs.append(threading.Thread(target=process1))
jobs.append(threading.Thread(target=process1))

for i in range(len(jobs)):
	jobs[i].start()

end  = time.time()

#output
#執行時間:0.168841 秒

可以發現,使用了threading後一樣的程式碼少了0.2秒左右

由此可知使用多執行緒可以幫助減少程式執行時間,增進使用體驗

參考資料

https://officeguide.cc/python-measure-execution-time-tutorial-examples/


上一篇
[Day 15] Day8 ~ 13複習
下一篇
[Day 17] 初見requests
系列文
用30天打好Python、LineBot的基礎&基本應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言